import BaseVenueProcessor from './BaseVenueProcessor.js';
import { getShengXuanDaZhuangVenueSettings } from '../request.js';

/**
 * 晟旋网球(大壮国际店)场地数据处理器
 */
export class ShengXuanDaZhuangProcessor extends BaseVenueProcessor {
  constructor() {
    super();
    this.venueName = '晟旋网球(大壮国际店)';
  }

  /**
   * 获取晟旋网球(大壮国际店)场地预约设置
   * @param {Object} params - 查询参数 { date }
   * @returns {Promise} 请求Promise
   */
  async getVenueSettings(params = {}) {
    // 设置默认参数
    const defaultParams = {
      date: new Date().toISOString().split('T')[0] // 默认今天
    };
    
    // 合并参数
    const requestData = { ...defaultParams, ...params };
    
    return await getShengXuanDaZhuangVenueSettings(requestData);
  }

  /**
   * 验证数据是否有效
   * @param {Object} data - 原始场地数据
   * @returns {boolean} 数据是否有效
   */
  validateData(data) {
    return data && 
           data.data && 
           data.data.spaces && 
           Array.isArray(data.data.spaces) && 
           data.data.resources && 
           Array.isArray(data.data.resources);
  }

  /**
   * 按场地名称分组
   * @param {Object} data - 原始场地数据
   * @returns {Map} 场地Map
   */
  groupVenues(data) {
    const venueMap = new Map();
    
    // 根据spaces数据创建场地分组
    data.data.spaces.forEach(space => {
      const venueName = space.space_name;
      if (!venueMap.has(venueName)) {
        venueMap.set(venueName, {
          name: venueName,
          spaceId: space.space_id,
          timeSlots: []
        });
      }
    });
    
    return venueMap;
  }

  /**
   * 处理时间槽
   * @param {Map} venueMap - 场地Map
   * @param {Object} data - 原始场地数据
   */
  processTimeSlots(venueMap, data) {
    // 遍历resources数组中的每个时间段数组
    data.data.resources.forEach(timeSlotArray => {
      if (Array.isArray(timeSlotArray)) {
        timeSlotArray.forEach(slot => {
          // 根据space_id找到对应的场地名称
          const space = data.data.spaces.find(s => s.space_id === slot.space_id);
          if (space && venueMap.has(space.space_name)) {
            const venue = venueMap.get(space.space_name);
            
            // 将时间从分钟转换为时:分格式
            const timeSlot = this.convertMinutesToTime(slot.time);
            const beginDatetime = `${this.selectedDate} ${timeSlot}`;
            const endDatetime = `${this.selectedDate} ${this.convertMinutesToTime(slot.time + 30)}`; // 每个时间段30分钟
            
            // 价格转换：worth为10000表示100元
            const price = slot.worth / 100;

            // 添加时间槽信息
            venue.timeSlots.push({
              time: `${timeSlot}-${this.convertMinutesToTime(slot.time + 30)}`,
              isFree: slot.status === 1, // status=1表示可预约
              price: price,
              beginDatetime: beginDatetime,
              endDatetime: endDatetime,
              resourceId: slot.id,
              remark: slot.remark || ''
            });
          }
        });
      }
    });
  }

  /**
   * 将分钟数转换为时:分格式
   * @param {number} minutes - 分钟数（如480表示8:00）
   * @returns {string} 时:分格式（如"08:00"）
   */
  convertMinutesToTime(minutes) {
    const hours = Math.floor(minutes / 60);
    const mins = minutes % 60;
    return `${hours.toString().padStart(2, '0')}:${mins.toString().padStart(2, '0')}`;
  }

  /**
   * 转换为场地列表
   * @param {Map} venueMap - 场地Map
   * @returns {Array} 场地列表
   */
  convertToVenueList(venueMap) {
    const venueList = [];
    
    venueMap.forEach((venue, venueName) => {
      // 按时间排序
      venue.timeSlots.sort((a, b) => {
        const timeA = a.beginDatetime;
        const timeB = b.beginDatetime;
        return timeA.localeCompare(timeB);
      });
      
      venueList.push({
        name: venueName,
        spaceId: venue.spaceId,
        timeSlots: venue.timeSlots,
        totalSlots: venue.timeSlots.length,
        availableSlots: venue.timeSlots.filter(slot => slot.isFree).length,
        dataSource: this.venueName // 添加dataSource字段
      });
    });
    
    return venueList;
  }

  /**
   * 处理场地数据（重写父类方法以添加特殊处理）
   * @param {Object} data - 原始场地数据
   * @param {string} selectedDate - 选中的日期
   * @returns {Array} 处理后的场地列表
   */
  process(data, selectedDate) {
    this.selectedDate = selectedDate;
    
    if (!this.validateData(data)) {
      console.warn('晟旋网球(大壮国际店)数据验证失败:', data);
      return [];
    }
    
    try {
      const venueMap = this.groupVenues(data);
      this.processTimeSlots(venueMap, data);
      const result = this.convertToVenueList(venueMap);
      
      console.log('晟旋网球(大壮国际店)数据处理完成:', result);
      return result;
    } catch (error) {
      console.error('晟旋网球(大壮国际店)数据处理出错:', error);
      return [];
    }
  }
}

export default ShengXuanDaZhuangProcessor;